package com.ktjy.test2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class GetUserInfo {
    public static void main(String[] args) {
        try {
            Class clz = Class.forName("com.ktjy.mapper.User"); //加载类User
            String UserName = clz.getName(); //获取User的包名
            String UserClassName = clz.getSimpleName(); //获取User的类名
            System.out.println("根目录是:" + UserName + "，类名是:" + UserClassName);
            System.out.println("-------------------------");
            Class superClass = clz.getSuperclass(); //获取User的父类
            System.out.println("User的父类是:" + superClass.getName());
            System.out.println("-------------------------");

            int modedifer = clz.getModifiers(); //获取Person类的实例的访问修饰符
            System.out.println(UserClassName + "类的访问修饰符是:");
            if ((modedifer & Modifier.PUBLIC) == Modifier.PUBLIC) {
                System.out.println("\t 访问修饰符是 :public");
            } else {
                System.out.println("\t 访问修饰符是 :defalt(package)");
            }
            if ((modedifer & Modifier.FINAL) == Modifier.FINAL) {
                System.out.println("\t 访问修饰符是 :final");
            }
            if ((modedifer & Modifier.ABSTRACT) == Modifier.ABSTRACT) {
                System.out.println("\t 这是一个抽象类");
            }
            if ((modedifer & Modifier.INTERFACE) == Modifier.INTERFACE) {
                System.out.println("\t 这是一个接口");
            }
            System.out.println("-------------------------");
            System.out.println("构造方法的信息");
            Constructor[] constructors = clz.getConstructors(); //获取User的所有构造方法
            for (Constructor c : constructors) {
                System.out.println("构造方法名:" + c.getName());
                System.out.println("构造方法参数列表:");
                Class[] parameterTypes = c.getParameterTypes();
                if (parameterTypes.length == 0) {
                    System.out.println("\t 无参数");
                } else {
                    for (Class c1 : parameterTypes) {
                        System.out.println("\t\t" + c1.getName());
                    }
                    System.out.println("----------------------------");
                }
            }
            System.out.println("-------------------------");
            System.out.println("属性信息");
            Field [] fields = clz.getDeclaredFields(); //获取User的所有属性
            for (Field f : fields){
                System.out.println("属性名:" + f.getName());
                System.out.println("属性类型:" + f.getType().getName()+"\n");
            }
            System.out.println("-------------------------");
            System.out.println("方法信息");
            Method[] methods = clz.getDeclaredMethods();
            for (Method m : methods){
                System.out.println("方法名:" + m.getName());
                System.out.println("方法返回值类型:" + m.getReturnType().getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
